/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package algoritmo2.cruces;

import algoritmo2.Arbol;
import algoritmo2.Individuo;
import algoritmo2.RandomPropio;
import algoritmo2.tipos.InfoNodo;
import java.util.ArrayList;

/**
 *
 * @author Ra
 */
public class Cruce1 extends Cruce {

    @Override
    public void cruce(Individuo padre1, Individuo padre2, Individuo hijo1, Individuo hijo2) {
        
        //primero clonamos los padres
        Individuo padre1Clon = padre1.Clone();
        Individuo padre2Clon = padre2.Clone();

        //Creamos los hijos
        //hijo1 = new Individuo();
        //hijo2 = new Individuo();
        //obtenemos los nodos seleccioanods de los padres clonadso
        ArrayList<InfoNodo> listaArbol1 = RandomPropio.preorden(padre1Clon.getArbol());
        ArrayList<InfoNodo> listaArbol2 = RandomPropio.preorden(padre2Clon.getArbol());
        Arbol nodoSeleccionado1;
        
            nodoSeleccionado1 = RandomPropio.dameNodo(listaArbol1);
        Arbol nodoSeleccionado2;
            nodoSeleccionado2 = RandomPropio.dameNodo(listaArbol2);
    
        while (nodoSeleccionado1.getProfundidad() + nodoSeleccionado2.getNumNodos() >= padre1.getHmax()
                || nodoSeleccionado1.getNumNodos() + nodoSeleccionado2.getProfundidad() >= padre2.getHmax()) {
            nodoSeleccionado1 = RandomPropio.dameNodo(listaArbol1);

            nodoSeleccionado2 = RandomPropio.dameNodo(listaArbol2);

        }
     
      

        Arbol nodoPadreSel1 = nodoSeleccionado1.getPadre();
        Arbol nodoPadreSel2 = nodoSeleccionado2.getPadre();
        if (nodoSeleccionado1.isEsHi()) {
            nodoPadreSel1.setHi(nodoSeleccionado2);
        } else if (nodoSeleccionado1.isEsHd()) {
            nodoPadreSel1.setHd(nodoSeleccionado2);
        } else if (nodoSeleccionado1.isRaiz()) {
            nodoSeleccionado2.setRaiz(true);
            nodoSeleccionado2.setEsHd(false);
            nodoSeleccionado2.setEsHi(false);
            hijo1.setArbol(nodoSeleccionado2);
        } else {
            nodoPadreSel1.setRamaCondicionIf(nodoSeleccionado2);
        }

        if (nodoSeleccionado2.isEsHi()) {
            nodoPadreSel2.setHi(nodoSeleccionado1);
        } else if (nodoSeleccionado2.isEsHd()) {
            nodoPadreSel2.setHd(nodoSeleccionado1);
        } else if (nodoSeleccionado2.isRaiz()) {
            nodoSeleccionado1.setRaiz(true);
            nodoSeleccionado1.setEsHd(false);
            nodoSeleccionado1.setEsHi(false);
            hijo2.setArbol(nodoSeleccionado1);
        } else {
            nodoPadreSel2.setRamaCondicionIf(nodoSeleccionado1);
        }

        if (hijo1.getArbol() == null) {
            hijo1.setArbol(padre1Clon.getArbol());
        }
        if (hijo2.getArbol() == null) {
            hijo2.setArbol(padre2Clon.getArbol());
        }
        hijo1.reestablecerProfundidad();
        hijo2.reestablecerProfundidad();
        hijo1.reestablecerNumNodos();
        hijo2.reestablecerNumNodos();
        hijo1.setHmax(padre1Clon.getHmax());
        hijo2.setHmax(padre2Clon.getHmax());


    }
}
